home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok19
/
trackdisksupport
/
trackdisksupport.dok
< prev
next >
Wrap
Text File
|
1993-11-04
|
13KB
|
303 lines
======================================================================
Dokumentation zu "TrackDiskSupport" Version 2.1
Autoren: Nicolas Benezan, Postwiesenstr. 2, D7000 Stuttgart 60
Fridtjof Siebert, Nobileweg 67, D7000 Stuttgart 40
Thanx to Frank Staudte for english translation
======================================================================
Kopierrecht
Das komplette Packet (Quelltext, Dokumentation und Objectcode) ist
Public Domain Software. Es darf beliebig kopiert und verbreitet werden
solange...
* unsere Namen und dieser Kopierrechtshinweis erhalten bleiben,
* die Vollständigkeit des ganzen Packets gewährleistet ist, und
* mit dem Vertrieb dieser Software kein Gewinn erwirtschaftet wird.
Die Kommerzielle Nutzung ohne unsere ausdrückliche schriftliche Genehmigung
ist untersagt. Ferner ist allen Personen, die in irgend einer Weise etwas
mit "Data Becker" zu tun haben, insbesondere für "Data Becker" arbeiten
oder deren Produkte verkaufen, jegliche Verwendung dieser Software
verboten.
Verbesserungsvorschläge sind stets willkommen. Falls Sie Veränderungen
am Programm vornehmen, dokumentieren Sie diese bitte gut verständlich.
Es würde uns freuen, wenn Sie uns über größere Veränderungen in
Kenntnis setzen würden.
(c) 1988 by Nicolas Benezan & Fridtjof Siebert.
Übersicht
* Umfang des Packets
* Einleitung
* Beschreibung der Prozeduren
Umfang des Packet
Das komplette Packet "TrackDiskSupport" beinhaltet folgendes:
* TrackDiskSupport.dok Diese Dokumentation
* TrackDiskSupport.doc Englische Dokumentation
* TrackDiskSupport.def, -.mod Quelltext
* TrackDiskSupport.sym, -.obj Objektcode
* TrackDemo.mod, -.obj Demo/Testmodul
* InhibitDemo.mod, -obj Demo/Testmodul
(Stand 14.Mai.1989)
Einleitung
Dieses Modul (Version 2.1) entstand im wesentlichen aus dem schon auf
Amok#11 veröffentlichten "TrackdiskSupport". Es unterstützt wie die alte
Version hauptsächlich die Programmierung des "trackdisk.device", d.h.
das Lesen und Schreiben einzelner Diskettenblöcke sowie einige
Zusatzfunktionen wie z.B. Motorkontrolle und Abfragen des Status. Neu
hinzugekommen ist die Möglichkeit, auch andere blockorientierte Geräte wie
Festplatten oder bestimmte Ramdisks anzusprechen. Neu ist außerdem eine
Prozedur, mit der man die Dos-Zugriffe auf ein bestimmtes Laufwerk sperren
kann (während eines Kopiervorgangs), sodaß die Workbench "DFx:BUSY"
anzeigt.
Beschreibung der Prozeduren
OpenDiskDevice()
----------------
Bevor mit einem Laufwerk gearbeitet werden kann, muß es zuerst mit
"OpenDiskDevice" geöffnet werden. Man übergibt den Namen des gewünschten
Geräts (z.B. "DF0", "DH1" oder "JH0"), wobei der Doppelpunkt weggelassen
wird. Unzulässig sind Diskettennamen (z.B. "Workbench") oder logische
Geräte, die mit "Assign" zugewiesen wurden (z.B. "SYS", "Libs"). Ebenfalls
unzulässig sind Geräte, die nicht blockorientiert sind (z.B. "CON", "RAW"
oder "PRT"). Beachten Sie bitte, daß manche Ramdisks blockorientiert sind
("CARD"), andere wiederum nicht ("RAM", "VD0").
Die Prozedur gibt einen opaken Datentyp "DiskUnit" zurück, der für die
weiteren Operationen gebraucht wird, sowie eine Fehlernummer (0 = kein
Fehler). Die Fehlernummern und ihre Bedeutung stehen im Modul "TrackDisk",
das sich im Standardumfang des Compilers befindet, und reichen von
"notSpecified=20" bis "postReset=35". Besonders zu erwähnen wäre der Fehler
"badDriveType=33", der unter anderem besagt, das das gewünschte Gerät nicht
angeschlossen ist, oder das es sich um ein nicht blockorientiertes handelt.
Bitte beachten Sie, daß weitere operationen (auch das Schließen) nur
zulässig sind, wenn das Öffnen erfolgreich war (Fehlernummer 0).
CloseDiskDevice()
-----------------
Sind alle Arbeiten mit einem Laufwerk abgeschlossen, sollte dieses mit
"CloseDiskDevice" geschlossen werden.
Falls ein Laufwerk durch einen Fehler im Programm oder einen Abbruch bei
Programmende geöffnet bleibt, wird dieses von TrackDiskSupport automatisch
geschlossen, sodaß nichts schlimmeres zu befürchten ist. Trotzdem sollte
nicht zu leichtsinnig damit umgegangen werden, da ein Datenverlust nicht
ganz auszuschließen ist.
Die folgenden Prozeduren sind im wesentlichen identisch mit denen der alten
Version von Amok#11. Sie implementieren meistens direkt die entsprechenden
Kommandos des trackdisk.device.
Es wurde konsequent darauf geachtet, daß der Benutzer nicht auf Byte-
Offsets oder ähnliches achten muß. Alle Prozeduren arbeiten mit logischen
Blocknummern, die bei 3.5"-Disk z.B. von 0 bis 1759 reichen (2 Seiten, 80
Zylinder, 11 Blöcke je Spur). Festplattenpartitionen werden richtig erkannt
und verwaltet. So muß z.B. Block Nr. 0 einer Festplattenpartition nicht
unbedingt wirklich auf der Spur 0, erster Block liegen, sondern ist der
erste Block der Partition, auch wenn die Partition erst bei Spur 100
anfängt.
Hier noch eine Begriffsklärung: Ein "Block" entspricht einem "sector", eine
"Spur" einem "track" und eine "Seite" einer "surface", wobei die Anzahl der
"Köpfe" ("heads") eines Laufwerks natürlich gleich der Anzahl "Seiten" ist.
Die Gesammtheit aller übereinanderliegenden "Spuren" bilden einen
sog. "Zylinder" ("cylinder"). Alles klar? Nein? Dann noch ein Beispiel:
Eine 3.5"-Diskette hat 2 Seiten (surfaces) und 80 Zylinder (cylinders),
insgesammt also 160 Spuren (tracks). Jede Spur hat 11 Blöcke (sectors),
insgesammt also 1760 Blöcke.
GetDeviceInfo()
---------------
Mit dieser Prozedur können alle wichtigen Parameter eines Laufwerks
ermittelt werden. Es wird ein RECORD mit folgenden Informationen geliefert:
devName: Name des zugehörigen devices (z.B. "trackdisk.device")
devUnit: Nummer der Laufwerkseinheit (z.B. 2 für DF2:)
devFlags: wird intern bei Aufruf von Exec.OpenDevice benötigt
blockLen: *Länge eines Blocks in Byte
trackLen: *Länge einer Spur in Byte
cylinderLen: Länge eines Zylinders in Byte
numBlocks: *Gesammtzahl der Blöcke auf der Disk oder Partition
alle logischen Blocknummern müssen im Bereich
[0..numBlocks-1] liegen!
offset: Anfang der Partition
disk: Zeiger auf weitere Informationen (siehe unten)
handler: für dieses Gerät zuständiger FileHandler-Prozess
Für den Benutzer sind nur die mit einem "*" gekennzeichneten Einträge
interessant. Vorsicht: Fragen sie diese immer ab und setzen sie keine
bestimmten Werte voraus. Bedenken Sie, daß auch 5.25"-Laufwerke mit nur
40 Zylinder angeschlossen sein können.
Für die ganz besonderen Spezialisten (siehe auch Modul "DosSupport"):
disk^.length: Anzahl der gültigen Parameter in dieser Tabelle
(normalerweise 11 oder 16 - Vorsicht: falls 11 sind
die Einträge ab BufMemType nicht mehr gültig!)
disk^.blockSize: Langwörter pro Block
disk^.origin: Nummer des ersten Blocks pro Spur (immer 0)
disk^.surfaces: Anzahl Seiten bzw. Köpfe
disk^.secBlock: Anzahl Sektoren pro logischem Block (immer 1)
disk^.numSecs: Blöcke pro Spur
disk^.resBlocks: Anzahl reservierter Blöcke (2 Boot-Blöcke)
disk^.prealloc: Preallocation-Faktor
disk^.interleave: Interleave-Faktor
disk^.lowCyl: Erster Zylinder der Partition
disk^.highCyl: Letzter Zylinder der Partition
disk^.numBuffers: Anzahl der Cache-Puffer
disk^.BufMemType: Typ des Pufferspeichers (1=egal, 3=chip, 5=fast)
disk^.reserved1: ???, meistens 7FFFFFFFH
disk^.reserved2: ???, meistens -2
disk^.reserved3: ???, meistens 0
disk^.diskType: Kennzeichen der Diskette (normalerweise "DOS")
BlockNumber()
-------------
Mit dieser Prozedur kann man aus der Zylinder-, Seiten- und Sektorzahl die
logische Blocknummer berechnen. Beachten Sie, daß bei Festplatten-
partitionen die Zylinder- und Blocknummern vom Anfang der Partition und
nicht vom tatsächlich hardwaremäßigen Anfang gezählt werden.
GetDiskChange()
---------------
Diese Prozedur entspricht dem "changeNum"-Kommando des trackdisk.device und
liefert die Anzahl der Diskettenwechsel seit dem Systemstart. Dies ist
notwendig, um eventuelle Diskettenwechsel zu bemerken. Unter anderem
benötigen auch die Read/Write-Prozeduren diese Zahl. Somit kann verhindert
werden, daß irrtümlich auf die falsche (inzwischen gewechselte) Diskette
geschrieben wird.
ChangeState()
-------------
Diese Prozedur entspricht dem "changeState"-Kommando des trackdisk.device
und gibt an, ob gerade eine Diskette in dem angegebenen Laufwerk eingelegt
ist.
ProtStatus()
------------
Diese Prozedur entspricht dem "protStatus"-Kommando des trackdisk.device
undgibt an, ob die Diskette in dem angegebenen Laufwerk beschrieben werden
darf.
Motor()
-------
Diese Prozedur entspricht dem "motor"-Kommando des trackdisk.device und
ermöglicht das An- oder Abschalten des Laufwerksmotors. In der Praxis wird
eigentlich nur das Abschalten benötigt, weil der Motor bei einer
Schreib/Leseoperation automatisch angeschaltet wird. Nach dem letzten
Zugriff, oder wenn bis zum nächsten Zugriff noch viel Zeit vergeht, sollte
man also den Motor abschalten. Bei Festplatten bewirkt das Kommando
natürlich nicht das Abschalten des Motors, sondern das Parken der Köpfe,
sofern die Platte über eine solche Funktion verfügt.
Seek()
------
Diese Prozedur entspricht dem "seek"-Kommando des trackdisk.device und
dient dazu, die Köpfe eines Laufwerks auf eine bestimmte Position zu
fahren. Normalerweise ist dies unnötig, da die Köpfe bei Schreib/Lese-
operationen automatisch bewegt werden. Eine mögliche Anwendung wäre:
bei einem Kopierprogramm schon vor dem einlegen der Diskette die Köpfe auf
die richtige Position zu fahren, um Zeit zu sparen.
ReadBlock()
-----------
Diese Prozedur entspricht dem "extRead"-Kommando des trackdisk.device und
dient zum Lesen von einem oder mehreren aufeinanderfolgenden Blöcken. Es
muß eine logische Blocknummer und die Anzahl der zu lesenden Blöcke sowie
die Adresse eines Puffers angegeben werden. Der Puffer muß auf einer
Langwortadresse beginnen und zumindest bei TrackDisk-Geräten im ChipMemory
liegen. Bei anderen Geräten (Festplatten, Ramdrives) im Zweifelsfall den
Eintrag "BufMemType" untersuchen (siehe "GetDeviceInfo"). Ferner muß die
Diskettenwechselnummer übergeben werden (siehe "GetDiskChange"). bei
mehreren zusammengehörigen Zugriffen sollte natürlich jedesmal die gleiche
Wechselnummer angegeben werden, wozu man diese in einer Variable speichert.
WriteBlock()
------------
Diese Prozedur entspricht dem "extWrite"-Kommando des trackdisk.device und
dient zum Schreiben von Blöcken. Die Parameter sind die gleichen wie bei
"ReadBlock".
Update()
--------
Diese Prozedur entspricht dem "update"-Kommando des trackdisk.device und
veranlaßt das trackdisk.device, noch im Speicher befindliche Puffer auf
Diskette zu schreiben. Dies hat folgenden Hintergrund: aus Geschwindig-
keitsgründen wird nicht jeder einzelne Block auf Diskette geschrieben,
sondern erst in einen Puffer geschrieben und solange gewartet, bis ein
Track komplett ist. Ist für längere Zeit kein Schreibzugriff mehr geplant,
empfiehlt sich aus Gründen der Datensicherheit, diesen Befehl zu verwenden,
denn der Benutzer könnte ja die Diskette herausnehmen oder der Computer
könnte abstürzen. In einem solchen Fall wären die zuletzt geschriebenen
Daten verloren.
FormatTrack()
-------------
Diese Prozedur entspricht dem "extFormat"-Kommando des trackdisk.device und
dient dazu, eine Spur zu formatieren und zu beschreiben. Der Puffer muß
genügend Daten für eine ganze Spur enthalten. Außer zum formatieren von
vorher leeren Disketten wird dieser Befehl auch in Kopierprogrammen
verwendet, da das Formatieren einer ganzen Spur schneller geht als das
beschreiben einzelner Blöcke.
Clear()
-------
Diese Prozedur entspricht dem "clear"-Kommando des trackdisk.device und
ist das Gegenteil von "Update". Es verhindert, das eventuell noch im
Speicher befindliche Puffer auf Diskette geschrieben werden (weil diese
eventuell ungültige Daten enthalten könnten). Der praktische Nutzen dieses
Befehls ist gering.
GetDriveType() und GetNumTracks()
---------------------------------
Diese Prozeduren wurden nur aus Kompatiblitätsgründen zur alten Version 1.0
übernommen. Von deren Verwendung wird dringendst abgeraten. Es wird
empfohlen, an deren Stelle die Prozedur "GetDeviceInfo" zu verwenden.
VORSICHT: bei einigen Harddisktreibern sind diese Befehle gar nicht
implementiert und führen zu den "schönsten" Abstürzen (Bildschirmflimmern
und Rattern aller Laufwerke)!
InhibitDrive()
--------------
Da z.B. während eines Kopiervorgangs eine diskette nur halb beschrieben ist
und teilweise ungültige Daten enthält, muß der Zugriff des Dos (Filesystem
und Disk-Validator) während dieser Zeit gesperrt werden. Dies kann mit
"InhibitDrive" geschehen. Die Workbench zeigt dann "DFx:BUSY" an und im CLI
wird "No Dos Disk" gemeldet.
Die Prozeduren zum Installieren von DiskChange-Interrupts entfielen
ersatzlos, da sie wegen eines Fehlers im Betriebssystem sowieso nicht
funktionieren können.
Demos / Testmodule
Zu "TrackDiskSupport" gehören zwei Demos, die die Verwendung der Prozeduren
demonstrieren
TrackDemo frägt nach einem Gerätenamen und zeigt dann einige Informationen
zum entsprechenden Laufwerk an.
InhibitDemo frägt nach einem Gerätenamen und sperrt das entsprechende
Laufwerk für 4 Sekunden für Dos-Zugriffe (erkennbar am Workbench-Icon).
------------
Viel Spaß